// 版权归Go作者所有。版权所有。
// 此源代码的使用受BSD样式
// 许可证的约束，该许可证可以在许可证文件中找到。

// 包goexperiment实现了对工具链实验的支持。
// 
// 工具链实验由GOEXPERIMENT 
// 环境变量控制。GOEXPERIMENT是以逗号分隔的
// 实验名称列表。GOEXPERIMENT可以在make.bash时间设置，该时间
// 为使用工具
// chain构建的二进制文件设置默认实验；也可以在构建时设置。GOEXPERIMENT也可以将
// 设置为“无”，这将禁用在
// make.bash时间启用的任何实验。
// 
// 实验以以下方式暴露于构建：
// 
// /-如果实验x（小写）已启用，则设置build tag goexperiment.x。
// 
// -对于每个实验x（在骆驼案例中），此包包含一个
// 布尔常量x和一个整数常量xInt。
// 
// -在运行时程序集中，如果启用了
// /实验x（小写），则定义宏GOEXPERITION_x。
// 
// 在工具链中，应通过objabi.experience访问为当前
// 构建启用的实验集。
// 
// 实验集包含在运行时的输出中。Version（）
// 和“go Version<binary>”如果与默认实验不同。
// 
// 有关当前工具链支持的一组实验，请参阅
// “go doc goexperiment.Flags”。
// 
// 请注意，此程序包定义了一组实验（在标志中）
// 并记录编译程序包
// 时启用的实验（作为布尔和整数常量）。
// 
// 请特别注意，此软件包本身不会在运行时基于GOEXPERION变量更改行为
// 。
// 构建中用于解释GOEXPERIMENT变量
// 的代码位于单独的包internal/buildcfg中。
package goexperiment

// go:generate go run mkconsts.go 

// 标志是可以在当前工具链中启用或禁用的实验集。
// 
// 当在GOEXPERIMENT环境变量或as build 
// 标记中指定时，实验使用字符串.ToLower作为其字段名。
// 
// 基线实验配置见
// objabi.experimentBaseline。
// 
// 如果更改此结构定义，请运行“go generate”。
type Flags struct {
	FieldTrack        bool
	PreemptibleLoops  bool
	StaticLockRanking bool

	// Regabi分为几个子实验，可以单独启用。并非所有的组合都有效。
	// “regabi”GOEXPERIMENT是所有“工作”
	// 子实验的别名。

	// RegabiWrappers支持ABI包装器在
	// ABI0和ABI内部函数之间调用。如果没有这个，ABI是
	// 假定是相同的，因此交叉ABI调用是直接的。
	RegabiWrappers bool
	// RegabiG在
	// ABIInteral中启用专用G和零寄存器。
	// 
	// 需要包装器，因为它使ABI不兼容。
	RegabiG bool
	// RegabiReflect启用
	// 反射调用中的寄存器传递路径。这也是由intArgRegs在
	// 反射和运行时（默认情况下禁用）中设置的，因此可以在目标测试中使用。
	RegabiReflect bool
	// RegabiDefer允许将延迟和go调用
	// 分解为无参数闭包。
	RegabiDefer bool
	// RegabiArgs在所有
	// 编译的Go函数中启用寄存器参数/结果。
	// 
	// 需要包装器（用于进行ABI转换）、g（因为
	// 已移植到ABIInternal的运行时程序集使用
	// g寄存器）、reflect（因此反射调用使用寄存器）、
	// 和defer（因为运行时不支持传递
	// 将参数注册到DEBER/go）。
	RegabiArgs bool
}
